]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell/window-tracker: Tighten sandbox ID prefix check
authorFlorian Müllner <fmuellner@gnome.org>
Wed, 8 Jul 2020 09:59:13 +0000 (11:59 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Wed, 8 Jul 2020 10:23:10 +0000 (12:23 +0200)
Since commit b60836932 we only allow WM_CLASS matches for sandboxed
applications if the found app's ID is prefixed by the sandbox ID.

The existing check still has a hole in it though: "org.example.Foo"
and "org.example.FooDevel" are different applications, yet the former
is a prefix of the latter.

So tighten the check by including a trailing "." in the checked prefix;
this excludes cases like the above, while still working for the regular
case of a single .desktop file because our app IDs include the ".desktop"
suffix.

Spotted by wjt.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1357

src/shell-window-tracker.c

index e754dde8ec719ee29ab0d902e5a5a4ada4708b7d..5c9d2ec80a645e345a28daefd09931fe527ed6b9 100644 (file)
@@ -146,9 +146,13 @@ get_app_from_window_wmclass (MetaWindow  *window)
   const char *wm_class;
   const char *wm_instance;
   const char *sandbox_id;
+  g_autofree char *app_prefix = NULL;
 
   appsys = shell_app_system_get_default ();
+
   sandbox_id = meta_window_get_sandboxed_app_id (window);
+  if (sandbox_id)
+    app_prefix = g_strdup_printf ("%s.", sandbox_id);
 
   /* Notes on the heuristics used here:
      much of the complexity here comes from the desire to support
@@ -188,23 +192,23 @@ get_app_from_window_wmclass (MetaWindow  *window)
   /* first try a match from WM_CLASS (instance part) to StartupWMClass */
   wm_instance = meta_window_get_wm_class_instance (window);
   app = shell_app_system_lookup_startup_wmclass (appsys, wm_instance);
-  if (app != NULL && check_app_id_prefix (app, sandbox_id))
+  if (app != NULL && check_app_id_prefix (app, app_prefix))
     return g_object_ref (app);
 
   /* then try a match from WM_CLASS to StartupWMClass */
   wm_class = meta_window_get_wm_class (window);
   app = shell_app_system_lookup_startup_wmclass (appsys, wm_class);
-  if (app != NULL && check_app_id_prefix (app, sandbox_id))
+  if (app != NULL && check_app_id_prefix (app, app_prefix))
     return g_object_ref (app);
 
   /* then try a match from WM_CLASS (instance part) to .desktop */
   app = shell_app_system_lookup_desktop_wmclass (appsys, wm_instance);
-  if (app != NULL && check_app_id_prefix (app, sandbox_id))
+  if (app != NULL && check_app_id_prefix (app, app_prefix))
     return g_object_ref (app);
 
   /* finally, try a match from WM_CLASS to .desktop */
   app = shell_app_system_lookup_desktop_wmclass (appsys, wm_class);
-  if (app != NULL && check_app_id_prefix (app, sandbox_id))
+  if (app != NULL && check_app_id_prefix (app, app_prefix))
     return g_object_ref (app);
 
   return NULL;